﻿using GamFi.Admin.API.Application.Contracts.Chat.AddMessage;
using GamFi.Admin.API.Application.Contracts.Chat.GetMessages;
using GamFi.Admin.API.Application.Contracts.Chat.UpdateMessage;
using GamFi.Admin.API.Application.Features.Queries.Chat.AddMessage;
using GamFi.Admin.API.Application.Features.Queries.Chat.DeleteMessage;
using GamFi.Admin.API.Application.Features.Queries.Chat.GetMessages;
using GamFi.Admin.API.Application.Features.Queries.Chat.UpdateMessage;
using MediatR;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace GamFi.Admin.API.WEB.Controllers;

[Authorize]
[ApiController]
[Route("api/[controller]")]
public class ChatController(IMediator mediator) : ControllerBase
{
    /// <summary>
    /// Получает все сообщения чата.
    /// </summary>
    /// <param name="request"></param>
    /// <param name="cancellationToken">Токен отмены операции.</param>
    /// <returns>Ответ, содержащий все сообщения.</returns>
    [HttpGet("GetMessages")]
    public async Task<GetMessagesResponse> GetMessages([FromQuery] GetMessagesRequest request, CancellationToken cancellationToken)
        => await mediator.Send(new GetMessagesQuery(request), cancellationToken);

    /// <summary>
    /// Добавляет новое сообщение в чат.
    /// </summary>
    /// <param name="request">Запрос на добавление сообщения.</param>
    /// <param name="cancellationToken">Токен отмены операции.</param>
    /// <returns>Ответ, содержащий результат добавления.</returns>
    [HttpPost("AddMessage")]
    public async Task AddMessage(AddMessageRequest request, CancellationToken cancellationToken)
        => await mediator.Send(new AddMessageCommand(request), cancellationToken);

    /// <summary>
    /// Обновляет существующее сообщение в чате.
    /// </summary>
    /// <param name="request">Запрос на обновление сообщения.</param>
    /// <param name="cancellationToken">Токен отмены операции.</param>
    /// <returns>Ответ, содержащий результат обновления.</returns>
    [HttpPut("UpdateMessage")]
    public async Task UpdateMessage(UpdateMessageRequest request, CancellationToken cancellationToken)
        => await mediator.Send(new UpdateMessageCommand(request), cancellationToken);

    /// <summary>
    /// Удаляет сообщение из чата по его идентификатору.
    /// </summary>
    /// <param name="id">Идентификатор сообщения, которое требуется удалить.</param>
    /// <param name="cancellationToken">Токен отмены операции.</param>
    /// <returns>Ответ, содержащий результат удаления.</returns>
    [HttpDelete("DeleteMessage/{id:guid}")]
    public async Task DeleteMessage(Guid id, CancellationToken cancellationToken)
        => await mediator.Send(new DeleteMessageCommand(id), cancellationToken);
}